home *** CD-ROM | disk | FTP | other *** search
Wrap
/******************************************************************/ /* */ /* TurboCAD for Windows */ /* Copyright (c) 1993 - 2001 */ /* International Microcomputer Software, Inc. */ /* (IMSI) */ /* All rights reserved. */ /* */ /******************************************************************/ // TCEvents.cpp : Defines the class behaviors for the application. // This sample demonstrate how handle TurboCAD's events #include "stdafx.h" #include "Events.h" #include "EventDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // Some IIDs from imsigx.i_c const IID LIBID_IMSIGXLib = {0x6A481400,0xE531,0x11CF,{0xA1,0x15,0x00,0xA0,0x24,0x15,0x8D,0xAF}}; const IID IID_PickResult = {0x6A481123,0xE531,0x11CF,{0xA1,0x15,0x00,0xA0,0x24,0x15,0x8D,0xAF}}; const IID IID_Tool = {0x6A48112C,0xE531,0x11CF,{0xA1,0x15,0x00,0xA0,0x24,0x15,0x8D,0xAF}}; //////////////////////////////////////////////////////////////////////////// // CTCEventsApp BEGIN_MESSAGE_MAP(CTCEventsApp, CWinApp) //{{AFX_MSG_MAP(CTCEventsApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(CTCEventsApp, CWinApp) //{{AFX_DISPATCH_MAP(CTCEventsApp) DISP_FUNCTION(CTCEventsApp, "BeforeExit", BeforeExit, VT_EMPTY, VTS_DISPATCH VTS_PBOOL) DISP_FUNCTION(CTCEventsApp, "DrawingNew", DrawingNew, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "DrawingOpen", DrawingOpen, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "DrawingActivate", DrawingActivate, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "DrawingDeactivate", DrawingDeactivate, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "DrawingBeforeClose", DrawingBeforeClose, VT_EMPTY, VTS_DISPATCH VTS_PBOOL) DISP_FUNCTION(CTCEventsApp, "DrawingBeforeSave", DrawingBeforeSave, VT_EMPTY, VTS_DISPATCH VTS_PBOOL VTS_PBOOL) DISP_FUNCTION(CTCEventsApp, "DrawingAfterSave", DrawingAfterSave, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "WindowResize", WindowResize, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "WindowActivate", WindowActivate, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "WindowDeactivate", WindowDeactivate, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "MouseDown", MouseDown, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_I2 VTS_I4 VTS_I4 VTS_I4 VTS_PBOOL) DISP_FUNCTION(CTCEventsApp, "MouseUp", MouseUp, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_I2 VTS_I4 VTS_I4 VTS_I4 VTS_PBOOL) DISP_FUNCTION(CTCEventsApp, "MouseMove", MouseMove, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_I4 VTS_I4 VTS_I4 VTS_PBOOL) DISP_FUNCTION(CTCEventsApp, "BeforeDoubleClick", BeforeDoubleClick, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_PBOOL) DISP_FUNCTION(CTCEventsApp, "BeforeRightClick", BeforeRightClick, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_PBOOL) DISP_FUNCTION(CTCEventsApp, "SelectionChange", SelectionChange, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "CommandBarControlHit", CommandBarControlHit, VT_EMPTY, VTS_DISPATCH VTS_PBOOL) DISP_FUNCTION(CTCEventsApp, "CommandBarControlStatus", CommandBarControlStatus, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "RunTool", RunTool, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "PointSnapped", PointSnapped, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_I4 VTS_I4 VTS_DISPATCH VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "PointPick", PointPick, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_BOOL) DISP_FUNCTION(CTCEventsApp, "RectanglePick", RectanglePick, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_BOOL) DISP_FUNCTION(CTCEventsApp, "PolygonPick", PolygonPick, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_BOOL) DISP_FUNCTION(CTCEventsApp, "ViewBeforeRedraw", ViewBeforeRedraw, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "ViewAfterRedraw", ViewAfterRedraw, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "VirtualIntersectionPick", VirtualIntersectionPick, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_BOOL) DISP_FUNCTION(CTCEventsApp, "CommandBarControlDone", CommandBarControlDone, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION(CTCEventsApp, "Drop", Drop, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH) //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() // Note: we add support for IID_IAppEvents to support typesafe binding // from VBA. This IID must match the GUID that is attached to the // dispinterface in the .ODL file. // {6A481301-E531-11CF-A115-00A024158DAF} static const IID IID_IAppEvents = { 0x6A481301, 0xE531, 0x11CF, { 0xA1, 0x15, 0x0, 0xA0, 0x24, 0x15, 0x8D, 0xAF } }; BEGIN_INTERFACE_MAP(CTCEventsApp, CWinApp) INTERFACE_PART(CTCEventsApp, IID_IAppEvents, Dispatch) END_INTERFACE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTCEventsApp construction CTCEventsApp::CTCEventsApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CTCEventsApp object CTCEventsApp theApp; ///////////////////////////////////////////////////////////////////////////// // CTCEventsApp initialization BOOL CTCEventsApp::InitInstance() { // Initialize OLE libraries if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif // Parse the command line to see if launched as OLE server if (RunEmbedded() || RunAutomated()) { // Register all OLE server (factories) as running. This enables the // OLE libraries to create objects from other applications. COleTemplateServer::RegisterAll(); // Application was run with /Embedding or /Automation. Don't show the // main window in this case. return TRUE; } // Hook up IDispatch EnableAutomation(); // When a server application is launched stand-alone, it is a good idea // to update the system registry in case it has been damaged. COleObjectFactory::UpdateRegistryAll(); CTCEventsDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel } // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; } // Let's show some useful information also... // Run through the pick result object and report what's in it. static void ShowGraphicInfo(CString& str, PickResult *pres) { if (pres) { long lCount = 0; pres->get_Count(&lCount); char* line = str.GetBuffer(2000); wsprintf(line, "%ld Graphics:\r\n", lCount); for (long l = 0; l < lCount; ++l) { char sline[30]; PickEntry *pentry = 0; COleVariant vindex(l); pres->get_Item(&vindex, &pentry); if (pentry) { IGraphic *pgr; pentry->get_Graphic(&pgr); if (pgr) { ImsiGraphicType type; if (SUCCEEDED(pgr->get_TypeByValue(&type))) { char *unk = "Unknown"; char *gname[] = {unk, unk, "Arc","Mesh","Viewport",unk,"Text", unk,unk,unk,unk,"Polyline",unk,unk,"Data","Ole Object", "Extended Data","Insert","Surface"}; wsprintf(sline, " %s\r\n", gname[type]); } pgr->Release(); } pentry->Release(); } strcat(line, sline); } str.ReleaseBuffer(); } } ///////////////////////////////////////////////////////////////////////////// // CTCEventsApp commands // All we do on an event is post a string to the edit box on the main dialog. void CTCEventsApp::BeforeExit(LPDISPATCH TheApp, BOOL FAR* Cancel) { GetDialog()->AppendText("BeforeExit\r\n"); } void CTCEventsApp::DrawingNew(LPDISPATCH WhichDrawing) { GetDialog()->AppendText("DrawingNew\r\n"); } void CTCEventsApp::DrawingOpen(LPDISPATCH WhichDrawing) { GetDialog()->AppendText("DrawingOpen\r\n"); } void CTCEventsApp::DrawingActivate(LPDISPATCH WhichDrawing) { GetDialog()->AppendText("DrawingActivate\r\n"); } void CTCEventsApp::DrawingDeactivate(LPDISPATCH WhichDrawing) { GetDialog()->AppendText("DrawingDeactivate\r\n"); } void CTCEventsApp::DrawingBeforeClose(LPDISPATCH WhichDrawing, BOOL FAR* Cancel) { GetDialog()->AppendText("DrawingBeforeClose\r\n"); } void CTCEventsApp::DrawingBeforeSave(LPDISPATCH WhichDrawing, BOOL FAR* SaveAs, BOOL FAR* Cancel) { GetDialog()->AppendText("DrawingBeforeSave\r\n"); } void CTCEventsApp::DrawingAfterSave(LPDISPATCH WhichDrawing) { GetDialog()->AppendText("DrawingAfterSave\r\n"); } void CTCEventsApp::WindowResize(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow) { GetDialog()->AppendText("WindowResize\r\n"); } void CTCEventsApp::WindowActivate(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow) { GetDialog()->AppendText("WindowActivate\r\n"); } void CTCEventsApp::WindowDeactivate(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow) { GetDialog()->AppendText("WindowDeactivate\r\n"); } void CTCEventsApp::MouseDown(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow, short Button, long Shift, long X, long Y, IMSI_BOOL* pbCancel) { *pbCancel = FALSE; GetDialog()->AppendText("MouseDown\r\n"); } void CTCEventsApp::MouseUp(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow, short Button, long Shift, long X, long Y, IMSI_BOOL* pbCancel) { *pbCancel = FALSE; GetDialog()->AppendText("MouseUp\r\n"); } void CTCEventsApp::MouseMove(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow, long Shift, long X, long Y, IMSI_BOOL* pbCancel) { *pbCancel = FALSE; GetDialog()->AppendText("MouseMove\r\n"); } void CTCEventsApp::BeforeDoubleClick(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow, LPDISPATCH Sel, BOOL FAR* Cancel) { GetDialog()->AppendText("BeforeDoubleClick\r\n"); } void CTCEventsApp::BeforeRightClick(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow, LPDISPATCH Sel, BOOL FAR* Cancel) { GetDialog()->AppendText("BeforeRightClick\r\n"); } void CTCEventsApp::SelectionChange(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow, LPDISPATCH Sel) { GetDialog()->AppendText("SelectionChange\r\n"); } void CTCEventsApp::CommandBarControlHit(LPDISPATCH WhichControl, BOOL FAR* Cancel) { GetDialog()->AppendText("CommandBarControlHit\r\n"); } void CTCEventsApp::CommandBarControlStatus(LPDISPATCH WhichControl) { GetDialog()->AppendText("CommandBarControlStatus\r\n"); } void CTCEventsApp::RunTool(LPDISPATCH WhichTool) { // Report on the name of the tool that's running CString toolName; if (WhichTool == NULL) { toolName = "<NULL>"; } else { Tool* pTool = NULL; HRESULT hRes = WhichTool->QueryInterface(IID_Tool, (void**)&pTool); if (SUCCEEDED(hRes)) { BSTR name = NULL; hRes = pTool->get_CommandName(0, &name); if (SUCCEEDED(hRes)) { toolName = name; ::SysFreeString(name); } else { toolName = "<No Name>"; } pTool->Release(); } else { toolName = "<No IID_Tool>"; } } toolName += "\r\n"; GetDialog()->AppendText("RunTool: "); GetDialog()->AppendText(toolName); } void CTCEventsApp::PointSnapped(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, long XScreen, long YScreen, LPDISPATCH PointRaw, LPDISPATCH PointSnapped) { GetDialog()->AppendText("PointSnapped\r\n"); } void CTCEventsApp::PointPick(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH Result, BOOL PickWasCanceled) { GetDialog()->AppendText("PointPick\r\n"); // Let's show some useful information also... PickResult* pRes = NULL; HRESULT hRes = Result->QueryInterface(IID_PickResult, (void**)&pRes); if (pRes != NULL) { CString str; ShowGraphicInfo(str, pRes); GetDialog()->AppendText(str); pRes->Release(); } } void CTCEventsApp::RectanglePick(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH Result, BOOL PickWasCanceled) { GetDialog()->AppendText("RectanglePick\r\n"); // Let's show some useful information also... PickResult* pRes = NULL; HRESULT hRes = Result->QueryInterface(IID_PickResult, (void**)&pRes); if (pRes != NULL) { CString str; ShowGraphicInfo(str, pRes); GetDialog()->AppendText(str); pRes->Release(); } } void CTCEventsApp::PolygonPick(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH Result, BOOL PickWasCanceled) { GetDialog()->AppendText("PolygonPick\r\n"); } void CTCEventsApp::ViewBeforeRedraw(LPDISPATCH WhichDrawing, LPDISPATCH WhichView) { GetDialog()->AppendText("ViewBeforeRedraw\r\n"); } void CTCEventsApp::ViewAfterRedraw(LPDISPATCH WhichDrawing, LPDISPATCH WhichView) { GetDialog()->AppendText("ViewAfterRedraw\r\n"); } void CTCEventsApp::VirtualIntersectionPick(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH Pick, BOOL WasCanceled) { GetDialog()->AppendText("VirtualIntersectionPick\r\n"); } void CTCEventsApp::CommandBarControlDone(LPDISPATCH WhichControl) { GetDialog()->AppendText("CommandBarControlDone\r\n"); } void CTCEventsApp::Drop(LPDISPATCH WhichDrawing, LPDISPATCH WhichView, LPDISPATCH WhichWindow, LPDISPATCH Sel) { GetDialog()->AppendText("Drop\r\n"); } // DUAL_SUPPORT_START // The rest of this file is boilerplate dual interface stuff. We use macros from MfcDual.h // and just wrap all of our implementation functions in TRY/CATCH blocks. // delegate standard IDispatch methods to MFC IDispatch implementation DELEGATE_DUAL_INTERFACE(CTCEventsApp, AppEvents) // Our method and property functions can generally just // delegate back to the methods we generated using // ClassWizard. However, if we set up properties to // access variables directly, we will need to write the // code to get/put the value into the variable. STDMETHODIMP CTCEventsApp::XAppEvents::BeforeExit(IApplication* TheApp, IMSI_BOOL* Cancel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { // Need to convert between boolean types BOOL bCancel = *Cancel; pThis->BeforeExit(TheApp, &bCancel); *Cancel = bCancel ? (IMSI_BOOL)-1 : (IMSI_BOOL)0; return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::DrawingNew(IDrawing* WhichDrawing) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->DrawingNew(WhichDrawing); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::DrawingOpen(IDrawing* WhichDrawing) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->DrawingOpen(WhichDrawing); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::DrawingActivate(IDrawing* WhichDrawing) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->DrawingActivate(WhichDrawing); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::DrawingDeactivate(IDrawing* WhichDrawing) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->DrawingDeactivate(WhichDrawing); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::DrawingBeforeClose(IDrawing* WhichDrawing, IMSI_BOOL* Cancel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { // Need to convert between boolean types BOOL bCancel = *Cancel; pThis->DrawingBeforeClose(WhichDrawing, &bCancel); *Cancel = bCancel ? (IMSI_BOOL)-1 : (IMSI_BOOL)0; return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::DrawingBeforeSave(IDrawing* WhichDrawing, IMSI_BOOL* SaveAs, IMSI_BOOL* Cancel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { // Need to convert between boolean types BOOL bSaveAs = *SaveAs; BOOL bCancel = *Cancel; pThis->DrawingBeforeSave(WhichDrawing, &bSaveAs, &bCancel); *SaveAs = bSaveAs ? (IMSI_BOOL)-1 : (IMSI_BOOL)0; *Cancel = bCancel ? (IMSI_BOOL)-1 : (IMSI_BOOL)0; return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::DrawingAfterSave(IDrawing* WhichDrawing) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->DrawingAfterSave(WhichDrawing); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::WindowResize(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->WindowResize(WhichDrawing, WhichView, WhichWindow); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::WindowActivate(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->WindowActivate(WhichDrawing, WhichView, WhichWindow); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::WindowDeactivate(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->WindowDeactivate(WhichDrawing, WhichView, WhichWindow); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::MouseDown(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow, ImsiMouseButton Button, long Shift, long X, long Y, IMSI_BOOL* pbCancel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->MouseDown(WhichDrawing, WhichView, WhichWindow, Button, Shift, X, Y, pbCancel); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::MouseUp(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow, ImsiMouseButton Button, long Shift, long X, long Y, IMSI_BOOL* pbCancel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->MouseUp(WhichDrawing, WhichView, WhichWindow, Button, Shift, X, Y, pbCancel); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::MouseMove(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow, long Shift, long X, long Y, IMSI_BOOL* pbCancel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->MouseMove(WhichDrawing, WhichView, WhichWindow, Shift, X, Y, pbCancel); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::BeforeDoubleClick(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow, Selection* Sel, IMSI_BOOL* Cancel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { // Need to convert between boolean types BOOL bCancel = *Cancel; pThis->BeforeDoubleClick(WhichDrawing, WhichView, WhichWindow, Sel, &bCancel); *Cancel = bCancel ? (IMSI_BOOL)-1 : (IMSI_BOOL)0; return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::BeforeRightClick(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow, Selection* Sel, IMSI_BOOL* Cancel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { // Need to convert between boolean types BOOL bCancel = *Cancel; pThis->BeforeRightClick(WhichDrawing, WhichView, WhichWindow, Sel, &bCancel); *Cancel = bCancel ? (IMSI_BOOL)-1 : (IMSI_BOOL)0; return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::SelectionChange(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow, Selection* Sel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->SelectionChange(WhichDrawing, WhichView, WhichWindow, Sel); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::CommandBarControlHit(CommandBarControl* WhichControl, IMSI_BOOL* Cancel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { // Need to convert between boolean types BOOL bCancel = *Cancel; pThis->CommandBarControlHit(WhichControl, &bCancel); *Cancel = bCancel ? (IMSI_BOOL)-1 : (IMSI_BOOL)0; return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::CommandBarControlStatus(CommandBarControl* WhichControl) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->CommandBarControlStatus(WhichControl); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::RunTool(Tool* WhichTool) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->RunTool(WhichTool); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::PointSnapped(IDrawing* WhichDrawing, View* WhichView, long XScreen, long YScreen, IVertex* PointRaw, IVertex* PointSnapped) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->PointSnapped(WhichDrawing, WhichView, XScreen, YScreen, PointRaw, PointSnapped); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::PointPick(IDrawing* WhichDrawing, View* WhichView, PickResult* Pick, IMSI_BOOL WasCanceled) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->PointPick(WhichDrawing, WhichView, Pick, WasCanceled); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::RectanglePick(IDrawing* WhichDrawing, View* WhichView, PickResult* Pick, IMSI_BOOL WasCanceled) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->RectanglePick(WhichDrawing, WhichView, Pick, WasCanceled); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::PolygonPick(IDrawing* WhichDrawing, View* WhichView, PickResult* Pick, IMSI_BOOL WasCanceled) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->PolygonPick(WhichDrawing, WhichView, Pick, WasCanceled); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::ViewBeforeRedraw(IDrawing* WhichDrawing, View* WhichView) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->ViewBeforeRedraw(WhichDrawing, WhichView); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::ViewAfterRedraw(IDrawing* WhichDrawing, View* WhichView) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->ViewAfterRedraw(WhichDrawing, WhichView); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::VirtualIntersectionPick(IDrawing* WhichDrawing, View* WhichView, PickResult* Pick, IMSI_BOOL WasCanceled) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->VirtualIntersectionPick(WhichDrawing, WhichView, Pick, WasCanceled); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::CommandBarControlDone(CommandBarControl* WhichControl) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->CommandBarControlDone(WhichControl); return S_OK; } CATCH_ALL_DUAL } STDMETHODIMP CTCEventsApp::XAppEvents::Drop(IDrawing* WhichDrawing, View* WhichView, Window* WhichWindow, Selection* Sel) { METHOD_PROLOGUE(CTCEventsApp, AppEvents) TRY_DUAL(IID_IAppEvents) { pThis->Drop(WhichDrawing, WhichView, WhichWindow, Sel); return S_OK; } CATCH_ALL_DUAL } // Implement ISupportErrorInfo to indicate we support the // OLE Automation error handler. IMPLEMENT_DUAL_ERRORINFO(CTCEventsApp, IID_IAppEvents) // DUAL_SUPPORT_END